package com.v2.k24;


import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;

@Component
@Aspect
public class ServiceAspect1 {

	//切入点1,该方法无方法体,主要为方便同类中其他方法使用此处配置的切入点
	@Pointcut("execution(* com.v2.k24.UserService.add()))")
	public void aspect1() {
	}

//	//切入点2
//	@Pointcut("execution(* com.v2.k24.UserService.delete()))")
//	public void aspect2() {
//	}

	/*
	 * 前置通知,使用在方法aspect()上注册的切入点
	 * 同时接受JoinPoint切入点对象,可以没有该参数
	 */
	@Before("aspect1()")
	public void before(JoinPoint joinPoint) {
		System.out.println("前置通知。。。"+joinPoint);
	}

	//配置环绕通知,使用在方法aspect()上注册的切入点
	@Around("aspect1()")
	public void around(JoinPoint joinPoint) throws Throwable {

		System.out.println("环绕通知前。。。"+joinPoint);
		try {
			((ProceedingJoinPoint) joinPoint).proceed();
		} catch (Exception e) {
			System.out.println("环绕通知抛异常。。。");
			e.printStackTrace();
		}
		System.out.println("环绕通知后。。。"+joinPoint);
	}

	//配置后置通知
	@AfterReturning("aspect1()")
	public void afterReturning(JoinPoint joinPoint) {
		System.out.println("后置通知（目标函数执行后，出现异常不会调用）。。。"+joinPoint);
	}

	//配置后置通知,使用在方法aspect()上注册的切入点
	@After("aspect1()")
	public void after(JoinPoint joinPoint) {
		System.out.println("后置通知（无论是否出现异常都会调用，在目标函数之后调用）。。。"+joinPoint);
	}

	//配置异常
	@AfterThrowing(pointcut = "aspect1()", throwing = "ex")
	public void afterException(JoinPoint joinPoint, Exception ex) {
		System.out.println("出现异常了。。。");
		ex.printStackTrace();
	}

}
